//go:build windows

package pccpu

import (
	"bufio"
	"encoding/json"
	"errors"
	"fmt"
	"github.com/StackExchange/wmi"
	"github.com/urfave/cli/v2"
	"os"
)

var (
	BuildTime string
	Version   = "1.0.0"
)

func Do() {
	app := cli.NewApp()
	app.Name = "cpu"
	app.Version = fmt.Sprintf("%s build:%s", Version, BuildTime)
	app.Usage = "通过 wmi 获取cpu信息"
	app.Description = "基于wmi获取cpu信息"
	app.Flags = []cli.Flag{
		&cli.BoolFlag{
			Name:    "id",
			Aliases: []string{"i"},
			Usage:   "获取 cpu id",
		},
	}
	app.Action = func(c *cli.Context) error {
		w := bufio.NewWriter(os.Stdout)
		result, err := GetCpuInfo()
		if err != nil {
			return err
		}
		if c.Bool("id") {
			w.WriteString(result[0].ProcessorId + "\n")
			w.Flush()
			return nil
		}

		bs, err := json.Marshal(result)
		if err != nil {
			return err
		}
		w.WriteString(string(bs) + "\n")
		w.Flush()
		return nil
	}
	if err := app.Run(os.Args); err != nil {
		fmt.Printf("命令行调用错误：%s ，请查看帮助文档", err.Error())
	}
}

type CpuInfo struct {
	Description               string // eg:Intel64 Family 6 Model 158 Stepping 13 ,描述
	CurrentClockSpeed         uint32 // eg:2901 ,-处理器的当前速度，以MHz为单位
	DataWidth                 uint16 // eg :64 ,在32位处理器，该值是32，在64位处理器是64
	DeviceID                  string // eg:cpu0,在系统上的处理器的唯一标识符
	Family                    uint16 // eg:205 ,处理器系列类型
	L2CacheSize               uint32 // eg:1536 ,二级缓存大小,kb
	L3CacheSize               uint32 // eg:9216 ,三级缓存的大小,kb
	Manufacturer              string // eg:GenuineIntel,处理器的制造商
	MaxClockSpeed             uint32 // eg：2901，处理器的最大速度，以MHz为单位
	Name                      string // eg :Intel(R) Core(TM) i5-9400 CPU @ 2.90GHz 处理器的名称
	NumberOfCores             uint32 // eg:6,芯为处理器的当前实例的数目。核心是在集成电路上的物理处理器
	NumberOfLogicalProcessors uint32 // eg:6  ,用于处理器的当前实例逻辑处理器的数量
	ProcessorId               string // eg:"BFEBFBFF000906ED",描述处理器功能的处理器的信息,CPUID
	SystemName                string // eg :"HCY",系统的名称
}

func GetCpuInfo() (cs []CpuInfo, err error) {
	err = wmi.Query("SELECT * FROM Win32_Processor", &cs)
	if err != nil {
		return nil, err
	}
	if len(cs) == 0 {
		return nil, errors.New("插件未能正确获取cpu信息")
	}
	return
}
